﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
using namespace std;

//class Person
//{
//public:
//	void Print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
//protected:
//	string _name = "peter"; // 姓名
//	int _age = 18; //年龄
//};
//// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。
//// 这里体现出了Student和Teacher复用了Person的成员。使用监视窗口查看
//// Student和Teacher对象，可以看到变量的复用。调用Print可以看到成员函数的复用。
//class Student : public Person
//{
//protected:
//	int _stuid; // 学号
//};
//class Teacher : public Person
//{
//protected:
//	int _jobid; // 工号
//};
//int main()
//{
//	Student s;
//	Teacher t;
//	s.Print();
//	t.Print();
//	return 0;
//}

//class Person
//{
//protected:
//	string _name; // 姓名
//	string _sex; //性别
//	int _age; // 年龄
//};
//class Student : public Person
//{
//public:
//	int _No; // 学号
//};
//void Test()
//{
//	Student sobj;
//	// 1.子类对象可以赋值给父类对象/指针/引用
//	Person pobj = sobj;
//	Person* pp = &sobj;
//	Person& rp = sobj;
//
//	//2.基类对象不能赋值给派生类对象
//	//sobj = pobj;
//
//	// 3.基类的指针可以通过强制类型转换赋值给派生类的指针
//	pp = &sobj;
//	Student * ps1 = (Student*)pp; // 这种情况转换时可以的。
//	ps1->_No = 10;
//
//	pp = &pobj;
//	Student* ps2 = (Student*)pp; // 这种情况转换时虽然可以，但是会存在越界访问的问题,运行时报错
//	ps2->_No = 10;
//}
//int main()
//{
//	Test();
//	return 0;
//}

// Student的_num和Person的_num构成隐藏关系，可以看出这样代码虽然能跑，但是非常容易混淆
//class Person
//{
//protected:
//	string _name = "小李子"; // 姓名
//	int _num = 111; // 身份证号
//};
//class Student : public Person
//{
//public:
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << " 身份证号:" << Person::_num << endl;//构成隐藏，显示访问父类_num，输出111
//		cout << " 学号:" << _num << endl;//构成隐藏，调用子类_num，输出999
//	}
//protected:
//	int _num = 999; // 学号
//};
//void Test()
//{
//	Student s1;
//	s1.Print();
//};


// B中的fun和A中的fun不是构成重载，因为不是在同一作用域
// B中的fun和A中的fun构成隐藏，成员函数满足函数名相同就构成隐藏。
//class A
//{
//public:
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//};
//class B : public A
//{
//public:
//	void fun(int i)
//	{
//		A::fun();//显示调用父类A中的fun
//		cout << "func(int i)->" << i << endl;
//	}
//};
//void Test()
//{
//	B b;
//	b.fun(10);
//	//b.fun();//这样写时会报错，参数不匹配，因为父类A中func被隐藏
//	b.A::fun();//应该这样显示调用
//};

//class Person
//{
//public:
//	Person(const char* name = "peter")
//		: _name(name)
//	{
//		cout << "Person()" << endl;
//	}
//
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//
//		return *this;
//	}
//
//	~Person()
//	{
//		cout << "~Person()" << endl;
//	}
//protected:
//	string _name; // 姓名
//};
//class Student : public Person
//{
//public:
//	Student(const char* name, int num)
//		//:_name(name)//这样初始化报错
//		: Person(name)//应该显示调用基类的构造
//		, _num(num)
//	{
//		cout << "Student()" << endl;
//	}
//
//	Student(const Student& s)
//		: Person(s)//应该显示调用基类的拷贝构造
//		, _num(s._num)
//	{
//		cout << "Student(const Student& s)" << endl;
//	}
//
//	Student& operator = (const Student& s)
//	{
//		cout << "Student& operator= (const Student& s)" << endl;
//		if (this != &s)
//		{
//			//显示调用基类的operator=,因为函数名相同构成隐藏，故需要写域名
//			Person::operator =(s);
//			_num = s._num;
//		}
//		return *this;
//	}
//
//	~Student()
//	{
//		cout << "~Student()" << endl;
//	}
//protected:
//	int _num; //学号
//};
//void Test()
//{
//	Student s1("jack", 18);
//	Student s2(s1);
//	Student s3("rose", 17);
//	s1 = s3;
//}

vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
	int n = nums1.size();
	vector<int> index(n);
	for (int i = 0; i < n; i++)
		index[i] = i;
	sort(nums1.begin(), nums1.end());
	sort(index.begin(), index.end(), [&](int x, int y)
		{
			return nums2[x] < nums2[y];
		});
	vector<int> ret(n);
	int left = 0, right = n - 1;
	while (left <= right)
	{
		if (nums1[left] > nums2[index[left]])
			ret[index[left++]] = nums1[left];
		else
			ret[index[right--]] = nums1[left];
	}
	return ret;
}
int longestPalindrome(string s) {
	int a[127] = { 0 };
	for (auto& e : s)
		a[e]++;
	int ret = 0;
	for (auto& e : a)
	{
		ret += e / 2 * 2;
	}
	return ret<s.size() ? ret + 1 : ret;
}

vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
	map<int, string, greater<int>> hash;
	int n= names.size();
	for (int i = 0; i < n; i++)
	{
		hash[heights[i]] = names[i];
	}
	vector<string> ret;
	for (auto& e : hash)
	{
		ret.push_back(e.second);
	}
	return ret;
}